#coding=utf-8


exception_string = '请输入正确的类型!'
def count(s):
    """
    写函数，计算传入的字符串中数字、字母、空格、以及其他的个数
    :param s:
    :return: digit_num, char_num, space_num, others_num  or exception_string
    """
    digit_num = 0
    char_num = 0
    space_num = 0
    others_num = 0
    if isinstance(s,(str)):
        for i in s:
            if i.isdigit():
                digit_num += 1
            elif i.isalpha():
                char_num += 1
            elif i.isspace():
                space_num += 1
            else:
                others_num += 1
        return (digit_num, char_num, space_num, others_num)
    else:

        return exception_string


#写函数检测用户传入的对象（字符、列表、元组）的每一个元素是否有空内容。

def is_space(args):
    result = False
    if isinstance(args,(str,list,tuple)):
        for i in args:
            if i == '':
                result = True
                break
        return result
    else:
        return exception_string

str1 = "dhn98f09f87f  * &"
list1 = ['1',3,4,2,'o', '']
dict1 = {'key1':'val1', 'key2':'2','':'dd'}
res1 = count(str1)
res2 = count(list1)
print "计算传入的字符串中数字、字母、空格、以及其他的个数:"
print res1
print res2
print "检测用户传入的对象（字符、列表、元组）的每一个元素是否有空内容:"
print is_space(str1)
print is_space(list1)
print is_space(dict1)

#检查传入列表的长度，如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者

def len_control(tmplist):
    """
    检查传入列表的长度，如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者 by yanping.zhang
    :param tmplist:
    :return: tmplist[0:2] or exception_string
    """
    if isinstance(tmplist,(list)):
        if len(list1) > 2:
            return tmplist[0:2]
        else:
            return '列表长度小于等于2'
    else:
        return exception_string

print "返回两个长度的内容:"
print len_control(str1)
print len_control(list1)


#检查获取传入列表或元组对象的所有奇数位索引对应的元素，并将其作为新列表返回给调用者

def getodd(args):
    """
    检查获取传入列表或元组对象的所有奇数位索引对应的元素，并将其作为新列表返回给调用者 by yanping.zhang
    :param args:
    :return: result or exception_string
    """
   # result = []
    if isinstance(args,(list,tuple)):

        ret = []
        for i in range(len(args)):
            if i % 2 == 1:
                ret.append(args[i])
            else:
                pass
        return ret
    else:
        return exception_string
list2 = [1,33,4,5,76,7,8]

print getodd(list2)

#检查传入字典的每一个value的长度,如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者

def dict_len_control(args):
    """
    检查传入字典的每一个value的长度,如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者 by yanping.zhang
    :param args:
    :return: ret or exception_string
    """
    if isinstance(args,(dict)):
        ret = {}
        for (k,v) in args.items():
            if len(v) > 2:
                ret[k] = v[0:2]
            else:
                ret[k] = v
        return ret
    else:
        return 'ddd'
dict1 = {"k1": "v1v1", "k2": [11, 22, 33, 44],"k3":"12"}
print "返回两个长度的字典内容：：："
print dict_len_control(dict1)

def guessnNum(args):
    """
    预设一个0~9之间的整数，让用户猜一猜并输入所猜的数，如果大于预设的数，显示“太大”；
    小于预设的数，显示“太小”，如此循环，直至猜中该数，显示“恭喜！你猜中了！”
    :param args:
    :return:
    """
    while True:
        reply = int(raw_input("Enter a number between 0 and 9: "))
        if reply == args:
            print "恭喜！你猜中了！"
            break
        elif reply > args:
            print "太大"
        else:
            print "太小"
            continue

guessnNum(6)

def function1(filename):
    """
    定义函数function1，计算每个学生的平均分（取整数），并将所有学生的学号 和平均分在屏幕上输出。
    :param filename:
    :return:
    """
    f = open(filename)
    a = f.readlines()

    list1 = []
    for line in a:
        line = line.strip()
        list2 = line.split()
        avg1 = int((int(list2[1])+int(list2[2]))/2)
        list1.append([list2[0],avg1])
    f.close()
    for list3 in list1:
        print (list3[0] + " "+ str(list3[1]))
ret = function1("score.txt")

def calAvg(L):
    """
    计算平均分
    :param L:
    :return:avg_score
    """
    sum = 0
    count = 0
    for score in L:
        sum += score
        count += 1
    avg_score = int(sum / count)
    return avg_score


def scoreAvg(filename):
    """
    定义函数calAvg()，计算某一门课程的平均分（函数参数为某门课成绩对应的 列表名，返回值为该门课的平均分）
    :param filename:
    :return:
    """

    f = open(filename)
    a = f.readlines()
    l1 = []
    l2 = []
    for line in a:
        line = line.strip()
        l3 = line.split()
        l1.append(int(l3[1]))
        l2.append(int(l3[2]))
    f.close()


    print("课程一的平均分为：", calAvg(l1))
    print("课程二的平均分为：", calAvg(l2))

scoreAvg("score.txt")


def insertLlist(L,x):
    """
    主程序中已有一个排好序的列表，请编写函数insertList，
    将从键盘接收的整数按原来从小到大的排序规律插入到该列表中
    :param L:
    :param x:
    :return:L
    """
    if x > L[len(L)-1]:
        L.append(x)
        return L
    else:
        for i in range(0,len(L)):
            if x < L[i]:
                L.insert(i,x)
                break
        return L
list4 = [1,3,5,6,7]
print insertLlist(list4,4)












